home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / dalla rivista / amiga.free / sorgenti vari / wolfedit2 2.0.4 source.sit / WolfEdit2 2.0.4 Source / WolfArt ƒ / WolfArt.p < prev    next >
Text File  |  1995-03-16  |  4KB  |  219 lines

  1. program WolfArt;
  2.     uses
  3.         QDOffscreen;
  4.  
  5.     const
  6.  
  7.         firstWallID = 300;
  8.         blankCTableID = 128;
  9.         artCTableID = 129;
  10.         artMapBrgrID = 145;
  11.  
  12.     type
  13.  
  14.         RGB8Ptr = ^RGB8;
  15.         RGB8 = packed record
  16.                 red, green, blue: 0..255;
  17.             end;
  18.  
  19.         CMap = packed array[0..767] of 0..255;
  20.         CMapPtr = ^CMap;
  21.         CMapHandle = ^CMapPtr;
  22.  
  23.     var
  24.  
  25.         appResFile: integer;
  26.         resFile: integer;
  27.         gworld: GWorldPtr;
  28.         pixmap: PixMapHandle;
  29.         pixels: Ptr;
  30.         drawing: GrafPtr;
  31.  
  32.     procedure OpenWolf;
  33.         var
  34.             types: SFTypeList;
  35.             reply: StandardFileReply;
  36.             result: OSErr;
  37.     begin
  38.         types[0] := 'APPL';
  39.         while true do begin
  40.                 StandardGetFile(nil, 1, types, reply);
  41.                 if not reply.sfGood then
  42.                     ExitToShell;
  43.                 resFile := FSpOpenResFile(reply.sfFile, fsRdPerm);
  44.                 result := ResError;
  45.                 if result = noErr then
  46.                     leave;
  47.                 writeln('Error number ', result : 1);
  48.             end;
  49.     end;
  50.  
  51.     procedure SaveCTable (ctab: CTabHandle);
  52.         var
  53.             h: Handle;
  54.             f: integer;
  55.             result: OSErr;
  56.     begin
  57.         h := Handle(ctab);
  58.         result := HandToHand(h);
  59.         f := CurResFile;
  60.         UseResFile(appResFile);
  61.         AddResource(h, 'clut', artCTableID, 'Art Colour Map');
  62.         WriteResource(h);
  63.         UpdateResFile(appResFile);
  64.         UseResFile(f);
  65.     end;
  66.  
  67.     function GetArtClut: CTabHandle;
  68.         var
  69.             ctab: CTabHandle;
  70.             brgr: CMapHandle;
  71.             i: integer;
  72.  
  73.         function DoubleByte (x: integer): integer;
  74.         begin
  75.             DoubleByte := BSL(x, 8) + x;
  76.         end;
  77.  
  78.         procedure RGB8to16 (src: univ RGB8Ptr; var dst: RGBColor);
  79.         begin
  80.             dst.red := DoubleByte(src^.red);
  81.             dst.green := DoubleByte(src^.green);
  82.             dst.blue := DoubleByte(src^.blue);
  83.         end;
  84.  
  85.     begin
  86.         ctab := GetCTable(artCTableID);
  87.         if ctab = nil then begin
  88.                 ctab := GetCTable(blankCTableID);
  89.                 brgr := CMapHandle(GetResource('BRGR', artMapBrgrID));
  90.                 for i := 0 to 255 do
  91.                     RGB8to16(@brgr^^[3 * i], ctab^^.ctTable[i].rgb);
  92.                 SaveCTable(ctab);
  93.             end;
  94.         ctab^^.ctSeed := GetCTSeed;
  95.         GetArtClut := ctab;
  96.     end;
  97.  
  98.     procedure InitBuffer;
  99.         var
  100.             bounds: Rect;
  101.             ctab: CTabHandle;
  102.  
  103.         procedure Check (result: QDErr);
  104.         begin
  105.             if result <> noErr then begin
  106.                     writeln('Couldn''t create gworld ( error number ', result : 1, ' ) ');
  107.                     ExitToShell;
  108.                 end;
  109.         end;
  110.  
  111.     begin
  112.         SetRect(bounds, 0, 0, 128, 128);
  113.         ctab := GetArtClut;
  114.         Check(NewGWorld(gworld, 8, bounds, ctab, nil, []));
  115.         pixmap := GetGWorldPixMap(gworld);
  116.         pixmap^^.rowBytes := pixmap^^.rowBytes - 4;
  117.         if not LockPixels(pixmap) then
  118.             writeln('LockPixels returned false!');
  119.         pixels := GetPixBaseAddr(pixmap);
  120.     end;
  121.  
  122.     procedure ShowBuffer;
  123.         var
  124.             r: Rect;
  125.     begin
  126.         ShowDrawing;
  127.         SetRect(r, 0, 0, 128, 128);
  128.         CopyBits(BitMapPtr(pixmap^)^, thePort^.portBits, r, r, srcCopy, nil);
  129.     end;
  130.  
  131. {$D-}
  132.     procedure DLZSS (src, dst: univ longint; dstLen: longint);
  133.         type
  134.             PackedByte = packed array[0..0] of 0..255;
  135.             BytePtr = ^PackedByte;
  136.         var
  137.             flagCount: integer;
  138.             flags: integer;
  139.             item: integer;
  140.             copyCount: integer;
  141.             pos: longint;
  142.  
  143.         function GetByte (var p: longint): integer;
  144.         begin
  145.             GetByte := BytePtr(p)^[0];
  146.             p := p + 1;
  147.         end;
  148.  
  149.         procedure PutByte (x: longint);
  150.         begin
  151.             BytePtr(dst)^[0] := x;
  152.             dst := dst + 1;
  153.             dstLen := dstLen - 1;
  154.         end;
  155.  
  156.     begin {DLZSS}
  157.         flagCount := 0;
  158.         while dstLen > 0 do begin
  159.                 if flagCount = 0 then begin
  160.                         flags := GetByte(src);
  161.                         flagCount := 8;
  162.                     end;
  163.                 if odd(flags) then
  164.                     PutByte(GetByte(src))
  165.                 else begin
  166.                         item := GetByte(src);
  167.                         item := item + BSL(GetByte(src), 8);
  168.                         copyCount := 3 + BAND($F, BSR(item, 12));
  169.                         pos := dst - $1000 + BAND(item, $FFF);
  170.                         if copyCount > dstLen then
  171.                             copyCount := dstLen;
  172.                         while copyCount > 0 do begin
  173.                                 PutByte(GetByte(pos));
  174.                                 copyCount := copyCount - 1;
  175.                             end;
  176.                     end;
  177.                 flags := BSR(flags, 1);
  178.                 flagCount := flagCount - 1;
  179.             end;
  180.     end;
  181. {$D+}
  182.  
  183.     procedure ViewWall (id: integer);
  184.         var
  185.             rsrc: Handle;
  186.     begin
  187.         rsrc := GetResource('BRGR', id);
  188.         if rsrc = nil then
  189.             writeln('Wall not found')
  190.         else begin
  191.                 DLZSS(rsrc^, pixels, $4000);
  192.                 ShowBuffer;
  193.             end;
  194.     end;
  195.  
  196.     procedure ArtViewLoop;
  197.         var
  198.             n: integer;
  199.             line: string;
  200.     begin
  201.         while true do begin
  202.                 write('View wall number: ');
  203.                 readln(line);
  204.                 if line = '' then
  205.                     ExitToShell;
  206.                 readstring(line, n);
  207.                 ViewWall(firstWallID + n - 1);
  208.             end;
  209.     end;
  210.  
  211. begin
  212.     appResFile := CurResFile;
  213.     ShowText;
  214.     ShowDrawing;
  215.     drawing := thePort;
  216.     OpenWolf;
  217.     InitBuffer;
  218.     ArtViewLoop;
  219. end.